[TOC]
计划任务,在特定的时间执行某项工作,在特定的时间执行一次,需要安装at服务,yum -y install at
atd是linux 下一次性定时计划任务命令的守候进程。 查看
ps -ef | grep atd
配置开机启动
chkconfig atd on
在未来的某个时间点执行一次某个任务,如果在企业管理中,有一个任务要在以后的一个时间里运行一次,那就使用at命令设置任务执行时间,如果任务比较复杂,可将命令写成脚本并在at命令中调用。
1.语法:
at(选项)(参数)
2.选项:
-m:当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-M:不发送邮件
-l:atq的别名
-d:atrm的别名
-r:atrm的别名
-v:显示任务将被执行的时间,显示的时间格式为:Thu Feb 20 14:50:00 1997
-c:打印任务的内容到标准输出
-V:显示版本信息
-q:后面加<队列> 使用指定的队列
-f:后面加<文件> 从指定文件读入任务而不是从标准输入读入
-t:后面<时间参数> 以时间参数的形式提交要运行的任务
3. 时间定义:
at允许使用一套相当复杂的指定时间的方法。
● 能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。 例如:04:00 ● 能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。 ● 能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 例如:12pm ● 能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。 例如:04:00 2009-03-1 ● 能够使用相对计时法。指定格式为:now + count time-units ,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,几天,几小时。 例如:now + 5 minutes 04pm + 3 days ● 能够直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。
AT Time中的时间表示方法
时 间 | 例子 | 说明 |
---|---|---|
Minute | at now + 5 minutes | 任务在5分钟后运行 |
Hour | at now + 1 hour | 任务在1小时后运行 |
Days | at now + 3 days | 任务在3天后运行 |
Weeks | at now + 2 weeks | 任务在两周后运行 |
Fixed | at midnight | 任务在午夜运行 |
Fixed | at 10:30pm | 任务在晚上10点30分 |
Fixed | at 23:59 12/31/2018 | 任务在2018年12月31号23点59分 |
4.相关命令:
● at:在特定的时间执行一次性的任务 ● atq:列出用户的计划任务,如果是超级用户将列出所有用户的任务,结果的输出格式为:作业号、日期、小时、队列和用户名 ● atrm:根据Job number删除at任务 ● batch:在系统负荷允许的情况下执行at任务,换言之,就是在系统空闲的情况下才执行at任务
5.相关配置文件:
● 时间规范的确切定义可以在/usr/share/doc/at-3.1.10/timespec中查看 ● 默认情况下计划任务都是放在/var/spool/at/这个文件 ● root用户可以在任何情况下使用at命令,而其他用户使用at命令的权限定义在/etc/at.allow(被允许使用计划任务的用户)和/etc/at.deny(被拒绝使用计划任务的用户)文件中 ● 如果/etc/at.allow文件存在,只有在该文件中的用户名对应的用户才能使用at ● 如果/etc/at.allow文件不存在,/etc/at.deny存在,所有不在/etc/at.deny文件中的用户可以使用at ● at.allow比at.deny优先级高,执行用户是否可以执行at命令,先看at.allow文件没有才看at.deny文件 ● 如果/etc/at.allow和/etc/at.deny文件都不存在,只有root用户能使用at ● 一个空内容的/etc/at.deny表示任何用户都能使用at命令,这是默认的配置 ● 一般情况下这两个文件存在一个即可。如果只有少数几个用户需要使用计划任务,那么就保留at.allow文件,如果大部分用户都要使用计划任务,那么保留at.deny即可
创建at任务方式有两种,从文件输入和从命令行输入。以下分别用两种方式创建1分钟后将当前时间写入 date.log 文件的命令
1. 文件输入:
[root@ localhost ~]# vim at.sh #编辑打印系统时间到data.log的脚本
#!/bin/bash
echo `date` >>date.log
[root@ localhost ~]# at -f at.sh now +1 minutes #启动at计划任务于下一分钟执行
job 2 at 2019-10-17 20:26
[root@ localhost ~]# atq #查看队列(未执行的定时任务)
2 2019-10-17 20:26 a root
[root@ localhost ~]# cat date.log #查看文件
Thu Oct 17 20:26:00 CST 2019
2.命令行输入:
创建格式:
at 时间 回车
at> 命令
at> Ctrl+D结束
#创建at定时任务
[root@ localhost ~]# at now +1 minutes
at> echo '命令行输入' >>date.log
at> <EOT>
job 5 at 2019-10-17 20:44
#查看at定时任务
[root@ localhost ~]# at -l
5 2019-10-17 20:44 a root
#作业号 执行时间 队列(将不同作业放入不同队列分类) 用户
#删除at作业:
命令:at -d或atrm 作业号
例:at -d 2
3.使用实例
实例1:三天后的下午 5 点执行 /bin/ls
命令:
at 5pm+3 days
输出:
[root@ localhost ~]# at 5pm+3 days
at> ls
at> <EOT>
job 7 at 2019-10-20 17:00
实例2:明天17点钟,输出时间到指定文件内
命令:
at 17:00 tomorrow
输出:
[root@ localhost ~]# at 17:00 tomorrow
at> date >./date.log
at> <EOT>
job 8 at 2019-10-18 17:20
实例3:计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务
命令:
atq 或 at -l
输出:
[root@ localhost ~]# atq
6 2019-10-20 17:00 a root
7 2019-10-20 17:00 a root
8 2019-10-18 17:20 a root
[root@ localhost ~]# at -l
6 2019-10-20 17:00 a root
7 2019-10-20 17:00 a root
8 2019-10-18 17:20 a root
实例4:删除已经设置的任务
命令:
atrm 7 或 at -d 作业号
输出:
[root@ localhost ~]# atrm 7
[root@ localhost ~]# at -l
6 2019-10-20 17:00 a root
8 2019-10-18 17:20 a root
实例5:显示已经设置的任务内容
命令:
at -c 8
输出:
[root@localhost ~]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22此处省略n个字符
crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。通常,crontab储存的指令被守护进程激活。crond 常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
yum -y install vixie-cron crontabs
说明:
vixie-cron 软件包是 cron 的主程序;
crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
配置
cron 是 linux 的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
service crond start #启动服务
service crond stop #关闭服务
service crond restart #重启服务
service crond reload #重新载入配置
service crond status #查看服务状态
在CentOS系统中加入开机自动启动:
chkconfig crond on
cron 的主配置文件是 /etc/crontab,它包括下面几行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前四行是用来配置 cron 任务运行环境的变量。
语法:
crontab[-u <用户名称>][配置文件] 或 crontab [-u <用户名称>][-elr]
解释:cron 是一个常驻服务,它提供计时器的功能,让用户在特定的时间得以执行预设的指令或程序。只要用户会编辑计时器的配置文件,就可以使用计时器的功能。其配置文件格式如下:Minute Hour Day Month DayOFWeek Command
参数说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容 #常用
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务 #常用
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
格式:
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
30 21 * * * /etc/init.d/httpd restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /etc/init.d/httpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /etc/init.d/httpd restart
上面的例子表示每周六、周日的1 : 10重启apache。
*/30 18-23 * * * /etc/init.d/httpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /etc/init.d/httpd restart
上面的例子表示每星期六的23 : 00重启apache。
* */1 * * * /etc/init.d/httpd restart
每一小时重启apache
* 20-23/1 * * * /etc/init.d/httpd restart
晚上20点到23点之间,每隔一小时重启apache
0 11 4 * mon-wed /etc/init.d/httpd restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /etc/init.d/httpd restart
一月一号的4点重启apache
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44
每半小时同步一下时间
需要特别注环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。
例如,以下任务就找不到service
52 10 * * * service httpd restart
需要写全路径
有可能是 /sbin/service , 也有可能是 /usr/sbin/service
使用以下命令确定:
which service
我的系统返回的是:/sbin/service
正确的路径的service
52 10 * * * /sbin/service httpd restart
特别注意:crontab中,无论如何都要用全路径,无论是crontab时间的定义中,还是可执行脚本中的命令。
含义:
进程(process):进程是程序的执行实例,即运行中的程序,也是程序的副本;程序放置于磁盘中,而进程放置于内存中;进程的启动及调度均是由内核发起的。centos6系统init是所有进程的父进程,而子进程是由fork()进程生成。
线程(Thread):一个进程至少包括一个线程,通常将该线程称为主线程,所以线程是比进程更小的单位,是系统分配处理器时间资源的基本单元。一个进程要想同时在多颗CPU上运行,必须得分成互不影响的多个执行流,而后每组单独在各自所分配的CPU上运行,这种分化后的执行流且有着比进程更小资源分配单位称之为线程。
进程优先级0-139 :
实时优先级:0-99 ,数字越大,优先级越高
静态优先级:100-139,数字越小,优先级越高
进程nice值:
指静态优先级,降低优先级
取值范围:-20—19;-20对用100,19对用139
进程类型:守护进程、用户进程
守护进程:系统启动时运行的进程,类似windows上的开机进程(开机任务),跟终端无关
用户进程:用户通过终端启动的进程,也可以叫前台进程,需要注意的是,也可以把前台进程送往后台,以守护模式运行。
进程状态:
运行态:running ,正在运行的进程就是当前进程(由current所指向的进程),而准备运行的进程只要得到CPU就可以立即投入运行,CPU是这些进程唯一等待的系统资源。系统中有一个运行队列(run_queue),用来容纳所有处于可运行状态的进程,调度程序执行时,从中选择一个进程投入运行。
等待态:waiting,处于该状态的进程正在等待某个事件(event)或某个资源,它肯定位于系统中的某个等待队列(wait_queue)中。Linux中处于等待状态的进程分为两种:可中断的等待状态和不可中断的等待状态。处于可中断等待态的进程可以被信号唤醒,如果收到信号,该进程就从等待状态进入可运行状态,并且加入到运行队列中,等待被调度;而处于不可中断等待态的进程是因为硬件环境不能满足而等待。
睡眠态:sleeping,可中断睡眠(interruptable)、不可中断睡眠(uninterruptable)
停止态:stop ,不会被调度 stopped ,此时的进程暂时停止运行来接受某种特殊处理。通常当进程接收到SIGSTOP、SIGTSTP、SIGTTIN或 SIGTTOU信号后就处于这种状态。例如,正接受调试的进程就处于这种状态。
僵死态:zombie,系统调用,终止进程的信息也还没有回收。顾名思义,处于该状态的进程就是死进程,这种进程实际上是系统中的垃圾,必须进行相应处理以释放其占用的资源。
**进程管理命令:**pstree,ps,pgrep,top,htop,vmstat,dstat
1.掌握生成信号
(1)中断进程
使用ctrl+c
组合键可以生产SIGINT信号比如用sleep命令测试
[root@wzp ~]# sleep 100
如果我不使用组合键那么控制台就无法进行输入了一直运行该sleep程序,所以通过这方法可以终止进程。
(2)暂停进程
有些进程想暂停而不是终止它可以使用ctrl+z
组合键生产SIGTSTP信号
[root@wzp ~]# sleep 100
[1]+ Stopped sleep 100
看到没有,如果是暂停进程会有log信息显示stopped的。 如上可以看到中括号里面有一个1数值就是shell分配的作业编号,第一个启动的进程分配作业编号1,第二个启动的进程分配作业编号2,依此类推,如果shell会话中存在停止的作业,退出shell时会发出警告信号的\
2.掌握trap捕捉信号的格式:
trap '命令' 信号列表
a) 掌握trap捕捉信号实例:捕捉中断信息和退出信号
#!/bin/bash
trap "echo 程序运行过程中不可中断" SIGINT
trap "echo 程序执行完毕" exit
for i in `seq 1 5`
do
if ping -c 1 10.0.0.$i &>/dev/null;then
echo 10.0.0.$i is up
else
echo 10.0.0.$i is down
fi
done
前台进程和后台进程:
前台进程需前台控制,所以只有等进程结束才能回到输入命令提示符状态。
而后台不需前台控制,启动后可以回到命令提示符状态继续执行其它进程。
1. nohup
用途:不挂断地运行命令。该命令可以在退出帐户之后继续运行相应的进程。 nohup就是不挂起的意思( no hang up)。
语法:nohup Command [ Arg … ] [ & ]
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
2. &
用途:在后台运行
一般两个一起用
例如:
[root@ localhost ~]# nohup sh test.sh &
[1] 27815
3.jobs
在Linux中,启动、停止、终止以及恢复作业的这些功能统称为作业控制。作业控制中的关键命令是jobs命令,jobs命令允许查看shell当前正在处理的作业。jobs命令中输出有加号和减号,带加号的作业被当做默认作业,带减号的为下一个默认作业。
# -l,列出进程的PID和作业号
[root@ localhost ~]# jobs -l
[1]+ 27874 Running nohup sh test.sh &
# -p,只列出作业的PID
[root@ localhost ~]# jobs -p
27874
[1]+ Done nohup sh test.sh
# -s,只列出停止的作业
$ jobs -s
# -r,只列出运行的作业
$ jobs -r
bg 将一个在后台暂停的命令,变成继续执行
fg 将后台中的命令调至前台继续运行
**补充:**Shell重定向&>file、2>&1、1>&2的区别
0 表示标准输入
1 表示标准输出
2 表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出. 例如:>/dev/null 2>&1
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中. 例如:&>/dev/null